nethackfandomcom-20200214-history
Source:NetHack 3.1.0/display.h
Below is the full text to display.h from the source code of NetHack 3.1.0. To link to a particular line, write [[NetHack 3.1.0/display.h#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)display.h 3.1 92/07/11 */ 2. /* Copyright © Dean Luick, with acknowledgements to Kevin Darcy */ 3. /* and Dave Cohrs, 1990. */ 4. /* NetHack may be freely redistributed. See license for details. */ 5. 6. #ifndef DISPLAY_H 7. #define DISPLAY_H 8. 9. #ifndef VISION_H 10. #include "vision.h" 11. #endif 12. 13. #ifndef MONDATA_H 14. #include "mondata.h" /* for mindless() */ 15. #endif 16. 17. #ifndef INVISIBLE_OBJECTS 18. #define vobj_at(x,y) (level.objectsxy) 19. #endif 20. 21. /* 22. * sensemon() 23. * 24. * Returns true if the hero can sense the given monster. This includes 25. * monsters that are hiding or mimicing other monsters. 26. */ 27. #define sensemon(mon) ( /* The hero can always sense a monster IF: */\ 28. (!mindless(mon->data)) && /* 1. the monster has a brain to sense AND */\ 29. ((Blind && Telepat) || /* 2a. hero is blind and telepathic OR */\ 30. /* 2b. hero is wearing a telepathy inducing */\ 31. /* object and in range */\ 32. ((HTelepat & (WORN_HELMET|WORN_AMUL|W_ART)) && \ 33. (distu(mon->mx, mon->my) <= (BOLT_LIM * BOLT_LIM)))) \ 34. ) 35. 36. 37. /* 38. * mon_visible() 39. * 40. * Returns true if the hero can see the monster. It is assumed that the 41. * hero can physically see the location of the monster. The function 42. * vobj_at() returns a pointer to an object that the hero can see there. 43. */ 44. #define mon_visible(mon) ( /* The hero can see the monster */\ 45. /* IF the monster */\ 46. (!mon->minvis || See_invisible) && /* 1. is not invisible AND */\ 47. (!mon->mundetected) /* 2. not an undetected hider */\ 48. ) 49. 50. 51. /* 52. * canseemon() 53. * 54. * This is the globally used canseemon(). It is not called within the display 55. * routines. 56. */ 57. #define canseemon(mon) (cansee(mon->mx, mon->my) && mon_visible(mon)) 58. 59. 60. /* 61. * canspotmon(mon) 62. * 63. * This is sensemon() or mon_visible() except that hiding under objects 64. * is considered irrelevant for this special case. 65. */ 66. #define canspotmon(mon) \ 67. (mon && (Blind ? sensemon(mon) : (!mon->minvis || See_invisible))) 68. 69. /* 70. * is_safepet(mon) 71. * 72. * A special case check used in attack() and domove(). Placing the 73. * definition here is convenient. 74. */ 75. #define is_safepet(mon) \ 76. (mon && mon->mtame && canspotmon(mon) && flags.safe_dog \ 77. && !Confusion && !Hallucination && !Stunned) 78. 79. 80. /* 81. * canseeself() 82. * 83. * This returns true if the hero can see her/himself. 84. * 85. * The u.uswallow check assumes that you can see yourself even if you are 86. * invisible. If not, then we don't need the check. 87. */ 88. #ifdef POLYSELF 89. #define canseeself() (Blind || u.uswallow || (!Invisible && !u.uundetected)) 90. #else 91. #define canseeself() (Blind || u.uswallow || !Invisible) 92. #endif 93. 94. 95. /* 96. * random_monster() 97. * random_object() 98. * 99. * Respectively return a random monster or object number. 100. */ 101. #define random_monster() rn2(NUMMONS) 102. #define random_object() (rn2(NROFOBJECTS) + 1) 103. 104. 105. /* 106. * what_obj() 107. * what_mon() 108. * 109. * If hallucinating, choose a random object/monster, otherwise, use the one 110. * given. 111. */ 112. #define what_obj(obj) (Hallucination ? random_object() : obj) 113. #define what_mon(mon) (Hallucination ? random_monster() : mon) 114. 115. 116. /* 117. * covers_objects() 118. * covers_traps() 119. * 120. * These routines are true if what is really at the given location will 121. * "cover" any objects or traps that might be there. 122. */ 123. #define covers_objects(xx,yy) \ 124. ((is_pool(xx,yy) && !Underwater) || (levlxxyy.typ LAVAPOOL)) 125. 126. #define covers_traps(xx,yy) covers_objects(xx,yy) 127. 128. 129. /* 130. * tmp_at() control calls. 131. */ 132. #define DISP_BEAM (-1) /* Keep all glyphs showing & clean up at end. */ 133. #define DISP_FLASH (-2) /* Clean up each glyph before displaying new one. */ 134. #define DISP_CHANGE (-3) /* Change glyph. */ 135. #define DISP_END (-4) /* Clean up. */ 136. 137. 138. /* Total number of cmap indices in the sheild_static[] array. */ 139. #define SHIELD_COUNT 21 140. 141. 142. /* 143. * display_self() 144. * 145. * Display the hero. This has degenerated down to this. Perhaps there is 146. * more needed here, but I can't think of any cases. 147. */ 148. #ifdef POLYSELF 149. #define display_self() \ 150. show_glyph(u.ux, u.uy, \ 151. u.usym 0 ? objnum_to_glyph(GOLD_PIECE) : \ 152. monnum_to_glyph((u.umonnum < 0 ? u.umonster : u.umonnum))) 153. #else 154. #define display_self() \ 155. show_glyph(u.ux, u.uy, \ 156. u.usym 0 ? objnum_to_glyph(GOLD_PIECE) : \ 157. monnum_to_glyph(u.umonster)) 158. #endif 159. 160. 161. /* 162. * A glyph is an abstraction that represents a _unique_ monster, object, 163. * dungeon part, or effect. The uniqueness is important. For example, 164. * It is not enough to have four (one for each "direction") zap beam glyphs, 165. * we need a set of four for each beam type. Why go to so much trouble? 166. * Because it is possible that any given window dependent display driver 167. * print_glyph() can produce something different for each type of glyph. 168. * That is, a beam of cold and a beam of fire would not only be different 169. * colors, but would also be represented by different symbols. 170. * 171. * Glyphs are grouped for easy accessibility: 172. * 173. * monster Represents all the wild (not tame) monsters. Count: NUMMONS. 174. * 175. * pet Represents all of the tame monsters. Count: NUMMONS 176. * 177. * corpse One for each monster. Count: NUMMONS 178. * 179. * object One for each object. Count: NROFOBJECTS+1 (we need the +1 180. * because NROFOBJECTS does not include the illegal object) 181. * 182. * trap One for each trap type. Count: TRAPNUM 183. * 184. * cmap One for each entry in the character map. The character map 185. * is the dungeon features and other miscellaneous things. 186. * Count: MAXPCHARS 187. * 188. * zap beam A set of four (there are four directions) for each beam type. 189. * The beam type is shifted over 2 positions and the direction 190. * is stored in the lower 2 bits. Count: NUM_ZAP << 2 191. * 192. * swallow A set of eight for each monster. The eight positions rep- 193. * resent those surrounding the hero. The monster number is 194. * shifted over 3 positions and the swallow position is stored 195. * in the lower three bits. Count: NUMMONS << 3 196. * 197. * The following are offsets used to convert to and from a glyph. 198. */ 199. #define NUM_ZAP 8 /* number of zap beam types */ 200. 201. #define GLYPH_MON_OFF 0 202. #define GLYPH_PET_OFF (NUMMONS + GLYPH_MON_OFF) 203. #define GLYPH_BODY_OFF (NUMMONS + GLYPH_PET_OFF) 204. #define GLYPH_OBJ_OFF (NUMMONS + GLYPH_BODY_OFF) 205. #define GLYPH_TRAP_OFF (NROFOBJECTS+1 + GLYPH_OBJ_OFF) 206. #define GLYPH_CMAP_OFF (TRAPNUM + GLYPH_TRAP_OFF) 207. #define GLYPH_ZAP_OFF (MAXPCHARS + GLYPH_CMAP_OFF) 208. #define GLYPH_SWALLOW_OFF ((NUM_ZAP << 2) + GLYPH_ZAP_OFF) 209. 210. #define MAX_GLYPH ((NUMMONS << 3) + GLYPH_SWALLOW_OFF) 211. 212. 213. #define mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_MON_OFF) 214. #define pet_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_PET_OFF) 215. 216. /* This has the unfortunate side effect of needing a global variable */ 217. /* to store a result. 'otg_temp' is defined and declared in decl.{ch}. */ 218. #define obj_to_glyph(obj) \ 219. (Hallucination ? \ 220. ((otg_temp = random_object()) CORPSE ? \ 221. random_monster() + GLYPH_BODY_OFF : \ 222. otg_temp + GLYPH_OBJ_OFF) : \ 223. ((obj)->otyp CORPSE ? \ 224. (int) (obj)->corpsenm + GLYPH_BODY_OFF : \ 225. (int) (obj)->otyp + GLYPH_OBJ_OFF)) 226. 227. #define trap_to_glyph(trap) ((int) (trap)->ttyp + GLYPH_TRAP_OFF) 228. #define cmap_to_glyph(cmap_idx) ((int) (cmap_idx) + GLYPH_CMAP_OFF) 229. 230. /* Not affected by hallucination. Gives a generic body for CORPSE */ 231. #define objnum_to_glyph(onum) ((int) (onum) + GLYPH_OBJ_OFF) 232. #define monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_MON_OFF) 233. #define petnum_to_glyph(mnum) ((int) (mnum) + GLYPH_PET_OFF) 234. 235. 236. /* 237. * Change the given glyph into it's given type. Note: 238. * 1) Pets are animals and are converted to the proper monster number. 239. * 2) Bodies are all mapped into the generic CORPSE object 240. * 3) glyph_to_swallow() does not return a showsyms[] index, but an 241. * offset from the first swallow symbol. 242. * 4) These functions assume that the glyph type has already been 243. * determined. That is, you have checked it with a glyph_is_XXXX() 244. * call. 245. */ 246. #define glyph_to_mon(glyph) ((int) ((glyph) < GLYPH_PET_OFF ? \ 247. glyph - GLYPH_MON_OFF : glyph - GLYPH_PET_OFF)) 248. #define glyph_to_obj(glyph) ((int) ((glyph) < GLYPH_OBJ_OFF ? \ 249. CORPSE : (glyph) - GLYPH_OBJ_OFF)) 250. #define glyph_to_trap(glyph) ((int) (glyph) - GLYPH_TRAP_OFF) 251. #define glyph_to_cmap(glyph) ((int) (glyph) - GLYPH_CMAP_OFF) 252. #define glyph_to_swallow(glyph) (((glyph) - GLYPH_SWALLOW_OFF) & 0x7) 253. 254. /* 255. * Return true if the given glyph is what we want. Note that bodies are 256. * considered objects. 257. */ 258. #define glyph_is_monster(glyph) \ 259. ((glyph) >= GLYPH_MON_OFF && (glyph) < GLYPH_BODY_OFF) 260. #define glyph_is_object(glyph) \ 261. ((glyph) >= GLYPH_BODY_OFF && (glyph) < GLYPH_TRAP_OFF) 262. #define glyph_is_trap(glyph) \ 263. ((glyph) >= GLYPH_TRAP_OFF && (glyph) < GLYPH_CMAP_OFF) 264. #define glyph_is_cmap(glyph) \ 265. ((glyph) >= GLYPH_CMAP_OFF && (glyph) < GLYPH_ZAP_OFF) 266. #define glyph_is_swallow(glyph) \ 267. ((glyph) >= GLYPH_SWALLOW_OFF && (glyph) < MAX_GLYPH) 268. 269. #endif /* DISPLAY_H */ display.h